home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Tool Chest / Dev.CD Feb 97 TC.toast / Sample Code / Interapplication Communication / MenuScripter 4.0 / Sources / MSAECoercions.c < prev    next >
Encoding:
Text File  |  1996-07-09  |  5.0 KB  |  167 lines  |  [TEXT/CWIE]

  1. // MSAECoercions.c
  2. //
  3. // Original version by Jon Lansdell and Nigel Humphreys.
  4. // 4.0 and 3.1 updates by Greg Sutton.
  5. // ©Apple Computer Inc 1996, all rights reserved.
  6.  
  7. /*
  8.     Changes for 4.0
  9.     
  10.     29-Feb-96 : GS : Added coercion of document to window.
  11.     29-Feb-96 : GS : Changed coercion of window to text to document to text.
  12. */
  13.  
  14. #include "MSAECoercions.h"
  15.  
  16. #include "MSAEUtils.h"
  17. #include "MSAETextUtils.h"
  18.  
  19. #include "MSAccessors.h"
  20. #include "MSAESelect.h"
  21. #include "MSToken.h"
  22.  
  23.  
  24. #pragma segment AppleEvent
  25.  
  26. // Install coercion handlers that coerce a descriptor from one type to another.
  27.  
  28. OSErr    InstallCoercions(void)
  29. {
  30.     OSErr    err;
  31.  
  32.       err = AEInstallCoercionHandler(typeObjectSpecifier, typeMyAppl,      (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceObjToAnything), 0, true, false);
  33.     err = AEInstallCoercionHandler(typeObjectSpecifier, typeMyWndw,      (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceObjToAnything), 0, true, false);
  34.     err = AEInstallCoercionHandler(typeObjectSpecifier, typeMyDocument,  (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceObjToAnything), 0, true, false);
  35.       err = AEInstallCoercionHandler(typeObjectSpecifier, typeMyText,      (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceObjToAnything), 0, true, false);
  36.       err = AEInstallCoercionHandler(typeObjectSpecifier, typeMyTextProp,  (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceObjToAnything), 0, true, false);
  37.       err = AEInstallCoercionHandler(typeObjectSpecifier, typeMyWindowProp,(AECoercionHandlerUPP)NewAECoerceDescProc(CoerceObjToAnything), 0, true, false);
  38.       err = AEInstallCoercionHandler(typeObjectSpecifier, typeMyApplProp,  (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceObjToAnything), 0, true, false);
  39.  
  40.       err = AEInstallCoercionHandler(typeMyDocument, typeMyWndw,  (AECoercionHandlerUPP)NewAECoercePtrProc(CoerceDocumentToWindow), 0, false, false);
  41.  
  42.       err = AEInstallCoercionHandler(typeMyDocument, typeMyText,  (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceDocumentToText), 0, true, false);
  43.       err = AEInstallCoercionHandler(typeMyDocumentProp, typeMyText,  (AECoercionHandlerUPP)NewAECoerceDescProc(CoerceDocumentPropertyToText), 0, true, false);
  44.  
  45.     return(err);
  46. }
  47.  
  48.  
  49. // Takes an object specifier that it resolves using AEResolve
  50. // then tries to coerce this result into the type specified by toType.
  51.  
  52. pascal OSErr    CoerceObjToAnything(const AEDesc    *theAEDesc,
  53.                                     DescType        toType,
  54.                                     long            handlerRefCon,
  55.                                     AEDesc            *result)
  56. {
  57. #ifdef __MWERKS__
  58.     #pragma unused (handlerRefCon)
  59. #endif
  60.  
  61.     AEDesc     objDesc = {typeNull, NULL};
  62.     OSErr      err;    
  63.     
  64.     if (theAEDesc->descriptorType != typeObjectSpecifier)
  65.         return(errAEWrongDataType);
  66.     
  67.         // resolve the object specifier
  68.     err = AEResolve(theAEDesc, kAEIDoMinimum, &objDesc);
  69.     if (noErr != err) goto done;
  70.         
  71.         // hopefully it's the right type by now, but we'll give it a nudge
  72.     err = AECoerceDesc(&objDesc, toType, result);
  73.  
  74. done:
  75.     if (objDesc.dataHandle)
  76.         AEDisposeDesc(&objDesc);
  77.             
  78.     return(err);
  79. }    // CoerceObjToAnything
  80.  
  81.  
  82. // A document is effectively a text item that contains all the text in the document
  83. // so allow coercion of documents to text.
  84.  
  85. pascal OSErr    CoerceDocumentToText(AEDesc    *theAEDesc,
  86.                                     DescType        toType,
  87.                                     long            handlerRefCon,
  88.                                     AEDesc            *result)
  89. {
  90. #ifdef __MWERKS__
  91.     #pragma unused (toType, handlerRefCon)
  92. #endif
  93.     
  94.     return(TextDescFromDocumentDesc(theAEDesc, result));
  95. }
  96.  
  97. // Some document properties are effectively text so allow a coercion
  98. // e.g. set selection of document 1 to "Something"
  99.  
  100. pascal OSErr    CoerceDocumentPropertyToText(AEDesc        *theAEDesc,
  101.                                             DescType    toType,
  102.                                             long        handlerRefCon,
  103.                                             AEDesc        *result)
  104. {
  105. #ifdef __MWERKS__
  106.     #pragma unused (toType, handlerRefCon)
  107. #endif
  108.     
  109.     WindowPropToken        aWindowPropToken;
  110.     TextToken            aTextToken;
  111.     Size                actualSize;
  112.     short                ignore;
  113.     OSErr                err;
  114.  
  115.     GetRawDataFromDescriptor(theAEDesc, (Ptr)&aWindowPropToken,
  116.                                         sizeof(aWindowPropToken), &actualSize);
  117.     
  118.     switch (aWindowPropToken.tokenProperty)
  119.     {
  120.         case pText:
  121.         case pContents:
  122.             err = TextDescFromDocumentToken(&(aWindowPropToken.tokenWindowToken), result);
  123.             break;
  124.  
  125.         case pSelection:
  126.             err = GetWindowSelection(aWindowPropToken.tokenWindowToken.tokenWindow,
  127.                                                                     &aTextToken, &ignore);
  128.             if (noErr != err) goto done;
  129.             
  130.             err = AECreateDesc(typeMyText, (Ptr)&aTextToken, sizeof(aTextToken), result);
  131.             break;
  132.             
  133.         default:            // Most properties don't make sense to be coerced from
  134.             err = errAECoercionFail;
  135.     }                        // e.g 'select insertion point before bounds of document 1'
  136.     
  137. done:    
  138.     return(err);
  139. }
  140.  
  141.  
  142. // Many actions are the same whether a window or a document e.g. close
  143. //  so allow a document to be coerced back to a window.
  144.  
  145. pascal OSErr    CoerceDocumentToWindow( DescType    typeCode,
  146.                                         Ptr            dataPtr,
  147.                                         Size        dataSize,
  148.                                         DescType    toType,
  149.                                         long        handlerRefcon,
  150.                                         AEDesc*        result )
  151. {
  152. #ifdef __MWERKS__
  153.     #pragma unused ( handlerRefcon )
  154. #endif
  155.  
  156.     OSErr    err;
  157.     
  158.     if ( typeMyDocument == typeCode && typeMyWndw == toType )
  159.         err = AECreateDesc( typeMyWndw, dataPtr, dataSize, result );
  160.     else
  161.         err = errAEWrongDataType;
  162.     
  163.     return err;
  164. }
  165.  
  166.  
  167.